overlay: Handle overlays when no main widget exists
authorBenjamin Otte <otte@redhat.com>
Sat, 6 Sep 2014 23:52:45 +0000 (01:52 +0200)
committerBenjamin Otte <otte@redhat.com>
Sat, 6 Sep 2014 23:57:09 +0000 (01:57 +0200)
Just pretend that the main widget is an empty widget the size of the
overlay.
Makes it possible to write testcases where no size requests are run on
overlay widgets before size_allocate() is called.

Testcase included.

gtk/gtkoverlay.c
testsuite/reftests/Makefile.am
testsuite/reftests/overlay-no-main-widget.ref.ui [new file with mode: 0644]
testsuite/reftests/overlay-no-main-widget.ui [new file with mode: 0644]

index d10bafe64eca9da14e13cc36a49f3651bb90f8df..c7c3e2788714d8a6496bbacea7f8281d957aa13c 100644 (file)
@@ -214,8 +214,8 @@ gtk_overlay_get_main_widget_allocation (GtkOverlay *overlay,
     {
       main_alloc.x = 0;
       main_alloc.y = 0;
-      main_alloc.width = 1;
-      main_alloc.height = 1;
+      main_alloc.width = gtk_widget_get_allocated_width (GTK_WIDGET (overlay));
+      main_alloc.height = gtk_widget_get_allocated_height (GTK_WIDGET (overlay));
     }
 
   if (main_alloc_out)
@@ -325,10 +325,8 @@ gtk_overlay_size_allocate (GtkWidget     *widget,
   GTK_WIDGET_CLASS (gtk_overlay_parent_class)->size_allocate (widget, allocation);
 
   main_widget = gtk_bin_get_child (GTK_BIN (overlay));
-  if (!main_widget || !gtk_widget_get_visible (main_widget))
-    return;
-
-  gtk_widget_size_allocate (main_widget, allocation);
+  if (main_widget && gtk_widget_get_visible (main_widget))
+    gtk_widget_size_allocate (main_widget, allocation);
 
   for (children = priv->children; children; children = children->next)
     gtk_overlay_child_allocate (overlay, children->data);
index 19c1a5e2fbf5f9e351bc3ac8c2304a56e494040f..5f84f8c81ffdb006abcef3c0231c391c5fb2cdb6 100644 (file)
@@ -314,6 +314,8 @@ testdata = \
        opacity.css \
        opacity.ui \
        opacity.ref.ui \
+       overlay-no-main-widget.ref.ui \
+       overlay-no-main-widget.ui \
        paned-undersized.css \
        paned-undersized.ref.ui \
        paned-undersized.ui \
diff --git a/testsuite/reftests/overlay-no-main-widget.ref.ui b/testsuite/reftests/overlay-no-main-widget.ref.ui
new file mode 100644 (file)
index 0000000..a895631
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.1 -->
+<interface>
+  <requires lib="gtk+" version="3.12"/>
+  <object class="GtkWindow" id="window1">
+    <property name="can_focus">False</property>
+    <child>
+      <object class="GtkOverlay" id="overlay1">
+        <property name="width_request">100</property>
+        <property name="height_request">100</property>
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <child>
+          <object class="GtkBox" id="box1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="orientation">vertical</property>
+            <child>
+              <placeholder/>
+            </child>
+          </object>
+        </child>
+        <child type="overlay">
+          <object class="GtkLabel" id="label1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">VISIBLE</property>
+          </object>
+        </child>
+      </object>
+    </child>
+  </object>
+</interface>
diff --git a/testsuite/reftests/overlay-no-main-widget.ui b/testsuite/reftests/overlay-no-main-widget.ui
new file mode 100644 (file)
index 0000000..08abb83
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.1 -->
+<interface>
+  <requires lib="gtk+" version="3.12"/>
+  <object class="GtkWindow" id="window1">
+    <property name="can_focus">False</property>
+    <child>
+      <object class="GtkOverlay" id="overlay1">
+        <property name="width_request">100</property>
+        <property name="height_request">100</property>
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <child>
+          <placeholder/>
+        </child>
+        <child type="overlay">
+          <object class="GtkLabel" id="label1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">VISIBLE</property>
+          </object>
+        </child>
+      </object>
+    </child>
+  </object>
+</interface>